{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "作业一（第3章用户冷启动）： \n",
    "在BX-Books数据集上，根据用户的所在地和年龄特征，进行用户冷启动，实现图书推荐，并在验证集上得到推荐的准确率和召回率 \n",
    "注意： \n",
    "1. 使用_pickle保存中间结果 \n",
    "2. 用户所在地划分精度，年龄特征分段 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.分析用户表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id                            location   age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user = pd.read_csv('./data/BX-Users.csv',sep=';')\n",
    "df_user.columns = ['user_id','location','age']\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "london, england, united kingdom       2506\n",
      "toronto, ontario, canada              2250\n",
      "sydney, new south wales, australia    1744\n",
      "melbourne, victoria, australia        1708\n",
      "portland, oregon, usa                 1629\n",
      "                                      ... \n",
      "london, -, united kingdom                1\n",
      "saigon, south vietnam,                   1\n",
      "campulung, arges, romania                1\n",
      "chattanooga, ,                           1\n",
      "pickett, wisconsin, usa                  1\n",
      "Name: location, Length: 57339, dtype: int64\n",
      "278858\n",
      "57339\n"
     ]
    }
   ],
   "source": [
    "#分析所属地点\n",
    "location_value_counts=df_user['location'].value_counts()\n",
    "print(location_value_counts)\n",
    "#总共有278858个用户\n",
    "print(location_value_counts.sum())\n",
    "#总共有57339个地区\n",
    "print(location_value_counts.count())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.863321648441723"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#平均每个地区，存在的用户个数\n",
    "location_value_counts.sum()/location_value_counts.count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_user['location'] = df_user['location'].apply(lambda location:location.rsplit(',',maxsplit=1)[-1].strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "278858"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#获取国家的名字\n",
    "len(df_user['location'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "709"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#获取国家的名字\n",
    "len(df_user['location'] .unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "location_value_counts = df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    location_value_counts,\n",
    "    labels=location_value_counts.index\n",
    ")\n",
    "plt.show()\n",
    "#获取哪个国家人数最多"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 110762 entries, 0 to 278857\n",
      "Data columns (total 3 columns):\n",
      " #   Column    Non-Null Count   Dtype  \n",
      "---  ------    --------------   -----  \n",
      " 0   user_id   110762 non-null  int64  \n",
      " 1   location  110762 non-null  object \n",
      " 2   age       0 non-null       float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 3.0+ MB\n"
     ]
    }
   ],
   "source": [
    "df_user[\n",
    "    df_user['age'].isnull()\n",
    "].info()\n",
    "#获取age为空的大概有多少"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 168096 entries, 1 to 278854\n",
      "Data columns (total 3 columns):\n",
      " #   Column    Non-Null Count   Dtype  \n",
      "---  ------    --------------   -----  \n",
      " 0   user_id   168096 non-null  int64  \n",
      " 1   location  168096 non-null  object \n",
      " 2   age       168096 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 4.5+ MB\n"
     ]
    }
   ],
   "source": [
    "#获取age为不为空的多少\n",
    "df_user_age_notnull = df_user[~df_user['age'].isnull()]\n",
    "df_user[~df_user['age'].isnull()].info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "age_value_counts_sort_by_age=df_user_age_notnull['age'].value_counts().sort_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    age_value_counts_sort_by_age,\n",
    "    labels=age_value_counts_sort_by_age.index\n",
    ")\n",
    "plt.show()\n",
    "#获取哪个年龄段人数最多"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "def divide_age(age):\n",
    "    if np.isnan(age) or (age<4) or (age>100):\n",
    "        return 0\n",
    "    if age>=7 and age<12:\n",
    "        return 1\n",
    "    if age>=13 and age<17:\n",
    "        return 2\n",
    "    if age >= 18 and age <= 45:\n",
    "        return 3\n",
    "    if age >= 46 and age <= 69:\n",
    "        return 4\n",
    "    if age >= 70 and age <= 100:\n",
    "        return 5\n",
    "df_user['age'] = df_user['age'].apply(divide_age)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa  0.0\n",
       "1        2             usa  3.0\n",
       "2        3          russia  0.0\n",
       "3        4        portugal  NaN\n",
       "4        5  united kingdom  0.0"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    df_user['age'].value_counts().sort_index(),\n",
    "    labels = ['undefined','shaoer','qingshaonian','qingnian','zhongnian','laonian']\n",
    ")\n",
    "plt.show()\n",
    "#因此处于青年的最多"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X     0.0\n",
       "1   276726  0155061224     5.0\n",
       "2   276727  0446520802     0.0\n",
       "3   276729  052165615X     3.0\n",
       "4   276729  0521795028     6.0"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating = pd.read_csv('./data/BX-Book-Ratings.csv',sep=';')\n",
    "df_rating.columns = ['user_id','item_id','rating']\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_rating=df_rating.dropna()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa  0.0\n",
       "1        2             usa  3.0\n",
       "2        3          russia  0.0\n",
       "3        4        portugal  NaN\n",
       "4        5  united kingdom  0.0"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#合并用户表与打分表\n",
    "df_user.head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X     0.0\n",
       "1   276726  0155061224     5.0\n",
       "2   276727  0446520802     0.0\n",
       "3   276729  052165615X     3.0\n",
       "4   276729  0521795028     6.0"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#合并用户表与打分表\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0.0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa  3.0  0195153448     0.0\n",
       "1        7      usa  0.0   034542252     0.0\n",
       "2        8   canada  0.0  0002005018     5.0\n",
       "3        8   canada  0.0  0060973129     0.0\n",
       "4        8   canada  0.0  0374157065     0.0"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#将表格内积\n",
    "df_data=pd.merge(\n",
    "    df_user,\n",
    "    df_rating,\n",
    "    on='user_id',\n",
    "    how='inner',\n",
    ")\n",
    "df_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "#保存表\n",
    "import _pickle as cPickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(\n",
    "    df_data,\n",
    "    open('./data/df_data.pkl','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "object1 = cPickle.load(\n",
    "    open('./data/df_data.pkl','rb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0.0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa  3.0  0195153448     0.0\n",
       "1        7      usa  0.0   034542252     0.0\n",
       "2        8   canada  0.0  0002005018     5.0\n",
       "3        8   canada  0.0  0060973129     0.0\n",
       "4        8   canada  0.0  0374157065     0.0"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "object1.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2.划分数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "#划分数据集 70%训练集 30%测试集\n",
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[109814,\n",
       " 561359,\n",
       " 182843,\n",
       " 854047,\n",
       " 559003,\n",
       " 225863,\n",
       " 80014,\n",
       " 795081,\n",
       " 1124497,\n",
       " 696669,\n",
       " 714705,\n",
       " 108845,\n",
       " 334836,\n",
       " 283236,\n",
       " 707194,\n",
       " 700021,\n",
       " 514144,\n",
       " 343464,\n",
       " 3503,\n",
       " 914936,\n",
       " 183738,\n",
       " 791873,\n",
       " 146542,\n",
       " 13830,\n",
       " 661565,\n",
       " 940198,\n",
       " 213986,\n",
       " 92038,\n",
       " 194541,\n",
       " 298162,\n",
       " 264764,\n",
       " 44535,\n",
       " 611952,\n",
       " 903112,\n",
       " 1000180,\n",
       " 556419,\n",
       " 984178,\n",
       " 77056,\n",
       " 639835,\n",
       " 720292,\n",
       " 1094021,\n",
       " 1012843,\n",
       " 433822,\n",
       " 1105356,\n",
       " 661154,\n",
       " 26315,\n",
       " 835165,\n",
       " 1075319,\n",
       " 910974,\n",
       " 1129357,\n",
       " 1019502,\n",
       " 1091796,\n",
       " 879747,\n",
       " 785428,\n",
       " 1069686,\n",
       " 66776,\n",
       " 380559,\n",
       " 173245,\n",
       " 1021114,\n",
       " 549217,\n",
       " 356781,\n",
       " 702337,\n",
       " 706564,\n",
       " 820391,\n",
       " 153701,\n",
       " 957909,\n",
       " 812972,\n",
       " 704865,\n",
       " 34200,\n",
       " 396491,\n",
       " 184879,\n",
       " 762346,\n",
       " 26904,\n",
       " 738016,\n",
       " 480519,\n",
       " 850854,\n",
       " 1115679,\n",
       " 1050689,\n",
       " 125255,\n",
       " 603355,\n",
       " 1037627,\n",
       " 489419,\n",
       " 1141207,\n",
       " 1014626,\n",
       " 372432,\n",
       " 322461,\n",
       " 1124870,\n",
       " 932183,\n",
       " 793961,\n",
       " 967407,\n",
       " 92547,\n",
       " 21290,\n",
       " 282544,\n",
       " 957015,\n",
       " 405121,\n",
       " 44058,\n",
       " 537630,\n",
       " 738297,\n",
       " 570278,\n",
       " 910727,\n",
       " 881553,\n",
       " 745,\n",
       " 227794,\n",
       " 131300,\n",
       " 1070219,\n",
       " 744617,\n",
       " 186203,\n",
       " 173865,\n",
       " 908486,\n",
       " 17954,\n",
       " 1123656,\n",
       " 791588,\n",
       " 154107,\n",
       " 1146267,\n",
       " 847684,\n",
       " 61104,\n",
       " 676243,\n",
       " 550586,\n",
       " 990926,\n",
       " 69271,\n",
       " 702190,\n",
       " 868371,\n",
       " 730578,\n",
       " 49895,\n",
       " 343636,\n",
       " 878786,\n",
       " 134734,\n",
       " 301956,\n",
       " 780370,\n",
       " 492754,\n",
       " 164367,\n",
       " 119871,\n",
       " 1087784,\n",
       " 812035,\n",
       " 1127295,\n",
       " 642071,\n",
       " 306476,\n",
       " 610679,\n",
       " 816335,\n",
       " 772775,\n",
       " 265226,\n",
       " 1121809,\n",
       " 708259,\n",
       " 1084444,\n",
       " 250748,\n",
       " 349808,\n",
       " 810016,\n",
       " 906351,\n",
       " 130140,\n",
       " 285245,\n",
       " 953660,\n",
       " 43227,\n",
       " 733037,\n",
       " 943139,\n",
       " 946127,\n",
       " 637126,\n",
       " 899696,\n",
       " 59261,\n",
       " 332560,\n",
       " 1093855,\n",
       " 681273,\n",
       " 1083897,\n",
       " 1079444,\n",
       " 288088,\n",
       " 720520,\n",
       " 1048832,\n",
       " 219734,\n",
       " 1143907,\n",
       " 773850,\n",
       " 471658,\n",
       " 713201,\n",
       " 194735,\n",
       " 569903,\n",
       " 1061791,\n",
       " 510109,\n",
       " 426292,\n",
       " 675402,\n",
       " 554798,\n",
       " 835023,\n",
       " 90229,\n",
       " 1049723,\n",
       " 168530,\n",
       " 413337,\n",
       " 1059336,\n",
       " 418380,\n",
       " 35987,\n",
       " 407189,\n",
       " 562560,\n",
       " 484291,\n",
       " 178467,\n",
       " 664856,\n",
       " 175617,\n",
       " 715431,\n",
       " 1127600,\n",
       " 279901,\n",
       " 1120263,\n",
       " 284050,\n",
       " 1014935,\n",
       " 1032400,\n",
       " 835413,\n",
       " 59191,\n",
       " 538657,\n",
       " 1019467,\n",
       " 714125,\n",
       " 830080,\n",
       " 470076,\n",
       " 1051213,\n",
       " 264463,\n",
       " 12500,\n",
       " 1036988,\n",
       " 720150,\n",
       " 256515,\n",
       " 109964,\n",
       " 756328,\n",
       " 966286,\n",
       " 758835,\n",
       " 882401,\n",
       " 661665,\n",
       " 752186,\n",
       " 454231,\n",
       " 941719,\n",
       " 719392,\n",
       " 403639,\n",
       " 378905,\n",
       " 801897,\n",
       " 130950,\n",
       " 869746,\n",
       " 787134,\n",
       " 1049571,\n",
       " 556750,\n",
       " 366747,\n",
       " 789377,\n",
       " 772836,\n",
       " 145037,\n",
       " 620545,\n",
       " 256537,\n",
       " 556617,\n",
       " 1054510,\n",
       " 675773,\n",
       " 115157,\n",
       " 798144,\n",
       " 108221,\n",
       " 814571,\n",
       " 626029,\n",
       " 225372,\n",
       " 976325,\n",
       " 680935,\n",
       " 508920,\n",
       " 934119,\n",
       " 557662,\n",
       " 921114,\n",
       " 721532,\n",
       " 520960,\n",
       " 955223,\n",
       " 1050664,\n",
       " 576761,\n",
       " 707114,\n",
       " 102275,\n",
       " 382113,\n",
       " 258661,\n",
       " 41758,\n",
       " 897832,\n",
       " 1041148,\n",
       " 276592,\n",
       " 1001016,\n",
       " 1122197,\n",
       " 89674,\n",
       " 986307,\n",
       " 1136472,\n",
       " 296855,\n",
       " 683338,\n",
       " 775486,\n",
       " 463170,\n",
       " 67431,\n",
       " 971833,\n",
       " 1057208,\n",
       " 605469,\n",
       " 29229,\n",
       " 672395,\n",
       " 810551,\n",
       " 477263,\n",
       " 131356,\n",
       " 531338,\n",
       " 597882,\n",
       " 352364,\n",
       " 872534,\n",
       " 749995,\n",
       " 891240,\n",
       " 91029,\n",
       " 27200,\n",
       " 1041885,\n",
       " 345546,\n",
       " 415741,\n",
       " 97771,\n",
       " 565077,\n",
       " 1100527,\n",
       " 347977,\n",
       " 1114073,\n",
       " 406967,\n",
       " 634918,\n",
       " 1048237,\n",
       " 980191,\n",
       " 470048,\n",
       " 592334,\n",
       " 1106898,\n",
       " 193270,\n",
       " 216484,\n",
       " 928435,\n",
       " 1142866,\n",
       " 585733,\n",
       " 409571,\n",
       " 1092000,\n",
       " 142134,\n",
       " 822887,\n",
       " 852309,\n",
       " 940689,\n",
       " 232674,\n",
       " 126147,\n",
       " 907352,\n",
       " 914382,\n",
       " 1084838,\n",
       " 747563,\n",
       " 322642,\n",
       " 1034354,\n",
       " 282193,\n",
       " 407811,\n",
       " 443820,\n",
       " 506066,\n",
       " 78762,\n",
       " 512709,\n",
       " 436574,\n",
       " 154014,\n",
       " 846516,\n",
       " 54238,\n",
       " 22976,\n",
       " 864494,\n",
       " 675113,\n",
       " 1146990,\n",
       " 62809,\n",
       " 87748,\n",
       " 517014,\n",
       " 913653,\n",
       " 611074,\n",
       " 389919,\n",
       " 637921,\n",
       " 236389,\n",
       " 592546,\n",
       " 681184,\n",
       " 444619,\n",
       " 1081071,\n",
       " 54455,\n",
       " 758189,\n",
       " 320601,\n",
       " 977053,\n",
       " 471720,\n",
       " 868825,\n",
       " 465671,\n",
       " 1070707,\n",
       " 911428,\n",
       " 819301,\n",
       " 396273,\n",
       " 818071,\n",
       " 161624,\n",
       " 1042144,\n",
       " 89327,\n",
       " 601433,\n",
       " 291971,\n",
       " 997501,\n",
       " 224059,\n",
       " 264196,\n",
       " 255861,\n",
       " 964908,\n",
       " 740050,\n",
       " 36537,\n",
       " 933298,\n",
       " 1092348,\n",
       " 740307,\n",
       " 605566,\n",
       " 760831,\n",
       " 447476,\n",
       " 819118,\n",
       " 99059,\n",
       " 221725,\n",
       " 1066443,\n",
       " 198929,\n",
       " 681289,\n",
       " 173582,\n",
       " 431910,\n",
       " 805900,\n",
       " 377060,\n",
       " 878265,\n",
       " 264549,\n",
       " 996491,\n",
       " 294801,\n",
       " 11146,\n",
       " 340925,\n",
       " 180998,\n",
       " 694210,\n",
       " 67719,\n",
       " 205964,\n",
       " 307042,\n",
       " 459429,\n",
       " 959669,\n",
       " 902206,\n",
       " 421152,\n",
       " 848645,\n",
       " 125043,\n",
       " 118215,\n",
       " 318132,\n",
       " 239885,\n",
       " 967488,\n",
       " 189346,\n",
       " 281709,\n",
       " 86357,\n",
       " 752736,\n",
       " 921644,\n",
       " 432745,\n",
       " 501516,\n",
       " 493109,\n",
       " 904503,\n",
       " 716087,\n",
       " 299906,\n",
       " 187491,\n",
       " 20009,\n",
       " 611709,\n",
       " 686569,\n",
       " 840353,\n",
       " 724681,\n",
       " 480043,\n",
       " 127664,\n",
       " 121540,\n",
       " 135482,\n",
       " 231375,\n",
       " 523609,\n",
       " 604122,\n",
       " 491725,\n",
       " 262383,\n",
       " 1687,\n",
       " 1139035,\n",
       " 552101,\n",
       " 882632,\n",
       " 771216,\n",
       " 777227,\n",
       " 273156,\n",
       " 874231,\n",
       " 69671,\n",
       " 606766,\n",
       " 733699,\n",
       " 657401,\n",
       " 6892,\n",
       " 735140,\n",
       " 1061919,\n",
       " 6079,\n",
       " 616845,\n",
       " 167530,\n",
       " 793819,\n",
       " 385169,\n",
       " 682915,\n",
       " 932641,\n",
       " 219400,\n",
       " 1119979,\n",
       " 416757,\n",
       " 836914,\n",
       " 148076,\n",
       " 401981,\n",
       " 430634,\n",
       " 751340,\n",
       " 896262,\n",
       " 1008449,\n",
       " 594122,\n",
       " 1142270,\n",
       " 342581,\n",
       " 812204,\n",
       " 56025,\n",
       " 546023,\n",
       " 65258,\n",
       " 338387,\n",
       " 404069,\n",
       " 766551,\n",
       " 385881,\n",
       " 211420,\n",
       " 286015,\n",
       " 212640,\n",
       " 567175,\n",
       " 254291,\n",
       " 154333,\n",
       " 757303,\n",
       " 119078,\n",
       " 534461,\n",
       " 757390,\n",
       " 272820,\n",
       " 528632,\n",
       " 861400,\n",
       " 194544,\n",
       " 545223,\n",
       " 1089301,\n",
       " 250353,\n",
       " 1121839,\n",
       " 253657,\n",
       " 691618,\n",
       " 601670,\n",
       " 646787,\n",
       " 921714,\n",
       " 492782,\n",
       " 11221,\n",
       " 196228,\n",
       " 237492,\n",
       " 211657,\n",
       " 924725,\n",
       " 814234,\n",
       " 752392,\n",
       " 378105,\n",
       " 277462,\n",
       " 812471,\n",
       " 730,\n",
       " 871071,\n",
       " 439680,\n",
       " 503279,\n",
       " 8960,\n",
       " 874948,\n",
       " 271879,\n",
       " 175857,\n",
       " 366271,\n",
       " 1124340,\n",
       " 559272,\n",
       " 883535,\n",
       " 352631,\n",
       " 818167,\n",
       " 640838,\n",
       " 136144,\n",
       " 49969,\n",
       " 255885,\n",
       " 825624,\n",
       " 558081,\n",
       " 112323,\n",
       " 1140006,\n",
       " 394254,\n",
       " 650814,\n",
       " 653065,\n",
       " 1147987,\n",
       " 709294,\n",
       " 47523,\n",
       " 304645,\n",
       " 646161,\n",
       " 597447,\n",
       " 419355,\n",
       " 895433,\n",
       " 444527,\n",
       " 1043320,\n",
       " 94302,\n",
       " 886512,\n",
       " 137703,\n",
       " 322871,\n",
       " 356838,\n",
       " 99285,\n",
       " 466357,\n",
       " 131556,\n",
       " 941570,\n",
       " 398080,\n",
       " 840368,\n",
       " 910220,\n",
       " 1121554,\n",
       " 765728,\n",
       " 156459,\n",
       " 453377,\n",
       " 188095,\n",
       " 921317,\n",
       " 89614,\n",
       " 1121836,\n",
       " 653176,\n",
       " 65505,\n",
       " 436695,\n",
       " 74733,\n",
       " 327544,\n",
       " 1101688,\n",
       " 206803,\n",
       " 106452,\n",
       " 863570,\n",
       " 990900,\n",
       " 806012,\n",
       " 699942,\n",
       " 382605,\n",
       " 848726,\n",
       " 898912,\n",
       " 217962,\n",
       " 183103,\n",
       " 91237,\n",
       " 452969,\n",
       " 319263,\n",
       " 285083,\n",
       " 633261,\n",
       " 765021,\n",
       " 1069771,\n",
       " 882484,\n",
       " 551957,\n",
       " 594903,\n",
       " 861875,\n",
       " 385935,\n",
       " 1118852,\n",
       " 1109686,\n",
       " 192149,\n",
       " 4978,\n",
       " 302044,\n",
       " 1089983,\n",
       " 212087,\n",
       " 952204,\n",
       " 516509,\n",
       " 1005376,\n",
       " 61762,\n",
       " 779435,\n",
       " 621299,\n",
       " 976012,\n",
       " 783233,\n",
       " 596045,\n",
       " 1129327,\n",
       " 710147,\n",
       " 416666,\n",
       " 354801,\n",
       " 83209,\n",
       " 786209,\n",
       " 109864,\n",
       " 203064,\n",
       " 1029344,\n",
       " 781087,\n",
       " 883687,\n",
       " 371620,\n",
       " 219616,\n",
       " 152751,\n",
       " 485551,\n",
       " 804665,\n",
       " 284784,\n",
       " 1062166,\n",
       " 208527,\n",
       " 1023643,\n",
       " 1102436,\n",
       " 485971,\n",
       " 1101458,\n",
       " 1043396,\n",
       " 703065,\n",
       " 661239,\n",
       " 872957,\n",
       " 560817,\n",
       " 708507,\n",
       " 1008496,\n",
       " 370053,\n",
       " 493413,\n",
       " 214148,\n",
       " 110598,\n",
       " 1081654,\n",
       " 301385,\n",
       " 773880,\n",
       " 84976,\n",
       " 294237,\n",
       " 308638,\n",
       " 350728,\n",
       " 837626,\n",
       " 375029,\n",
       " 522242,\n",
       " 1066677,\n",
       " 383039,\n",
       " 1019013,\n",
       " 1048855,\n",
       " 10991,\n",
       " 986913,\n",
       " 326666,\n",
       " 580262,\n",
       " 734385,\n",
       " 1058912,\n",
       " 920159,\n",
       " 471446,\n",
       " 140275,\n",
       " 895225,\n",
       " 990655,\n",
       " 831120,\n",
       " 668110,\n",
       " 99155,\n",
       " 900474,\n",
       " 873334,\n",
       " 185073,\n",
       " 686426,\n",
       " 929899,\n",
       " 972748,\n",
       " 30341,\n",
       " 234151,\n",
       " 79704,\n",
       " 739630,\n",
       " 765748,\n",
       " 671750,\n",
       " 499782,\n",
       " 1149754,\n",
       " 998463,\n",
       " 715449,\n",
       " 489815,\n",
       " 68495,\n",
       " 387247,\n",
       " 265647,\n",
       " 941170,\n",
       " 424322,\n",
       " 983346,\n",
       " 898770,\n",
       " 29876,\n",
       " 730205,\n",
       " 262216,\n",
       " 564486,\n",
       " 747551,\n",
       " 1141674,\n",
       " 651711,\n",
       " 149932,\n",
       " 725600,\n",
       " 431650,\n",
       " 98373,\n",
       " 247675,\n",
       " 269563,\n",
       " 1084426,\n",
       " 21081,\n",
       " 1019358,\n",
       " 1080897,\n",
       " 881715,\n",
       " 838210,\n",
       " 1047647,\n",
       " 134457,\n",
       " 395178,\n",
       " 384724,\n",
       " 732095,\n",
       " 480006,\n",
       " 690151,\n",
       " 869687,\n",
       " 1024044,\n",
       " 245292,\n",
       " 830302,\n",
       " 153605,\n",
       " 753034,\n",
       " 1068851,\n",
       " 787618,\n",
       " 214983,\n",
       " 410952,\n",
       " 539302,\n",
       " 187985,\n",
       " 253860,\n",
       " 772147,\n",
       " 366816,\n",
       " 398503,\n",
       " 172810,\n",
       " 137151,\n",
       " 885524,\n",
       " 940566,\n",
       " 915974,\n",
       " 938218,\n",
       " 84673,\n",
       " 869504,\n",
       " 108104,\n",
       " 196960,\n",
       " 627310,\n",
       " 1064306,\n",
       " 823297,\n",
       " 789417,\n",
       " 696949,\n",
       " 771291,\n",
       " 732272,\n",
       " 132346,\n",
       " 698591,\n",
       " 388873,\n",
       " 253950,\n",
       " 56545,\n",
       " 931959,\n",
       " 821739,\n",
       " 1048758,\n",
       " 673920,\n",
       " 69142,\n",
       " 429117,\n",
       " 601889,\n",
       " 662863,\n",
       " 602012,\n",
       " 318152,\n",
       " 670651,\n",
       " 989202,\n",
       " 756439,\n",
       " 474776,\n",
       " 1120703,\n",
       " 72267,\n",
       " 987566,\n",
       " 326563,\n",
       " 436186,\n",
       " 692428,\n",
       " 504832,\n",
       " 997963,\n",
       " 464807,\n",
       " 654636,\n",
       " 341123,\n",
       " 412899,\n",
       " 972134,\n",
       " 1011474,\n",
       " 693777,\n",
       " 998308,\n",
       " 937273,\n",
       " 971488,\n",
       " 565547,\n",
       " 915108,\n",
       " 615375,\n",
       " 166356,\n",
       " 825550,\n",
       " 977247,\n",
       " 206661,\n",
       " 675497,\n",
       " 802724,\n",
       " 1112313,\n",
       " 271197,\n",
       " 488947,\n",
       " 120296,\n",
       " 337667,\n",
       " 872923,\n",
       " 1067939,\n",
       " 931441,\n",
       " 571915,\n",
       " 492963,\n",
       " 609368,\n",
       " 366935,\n",
       " 1091089,\n",
       " 497956,\n",
       " 875022,\n",
       " 173847,\n",
       " 808617,\n",
       " 1148637,\n",
       " 132492,\n",
       " 772276,\n",
       " 976831,\n",
       " 282847,\n",
       " 352816,\n",
       " 722030,\n",
       " 269181,\n",
       " 293044,\n",
       " 638183,\n",
       " 872316,\n",
       " 323973,\n",
       " 336192,\n",
       " 952491,\n",
       " 562512,\n",
       " 486553,\n",
       " 411430,\n",
       " 622232,\n",
       " 401121,\n",
       " 103150,\n",
       " 648223,\n",
       " 402254,\n",
       " 938155,\n",
       " 53999,\n",
       " 379389,\n",
       " 332318,\n",
       " 698432,\n",
       " 338213,\n",
       " 683223,\n",
       " 82865,\n",
       " 210899,\n",
       " 510396,\n",
       " 86585,\n",
       " 728612,\n",
       " 451989,\n",
       " 175258,\n",
       " 366484,\n",
       " 968530,\n",
       " 912529,\n",
       " 360797,\n",
       " 198188,\n",
       " 1099292,\n",
       " 106377,\n",
       " 497123,\n",
       " 213959,\n",
       " 869164,\n",
       " 326679,\n",
       " 498099,\n",
       " 643532,\n",
       " 358249,\n",
       " 944903,\n",
       " 268112,\n",
       " 773413,\n",
       " 838469,\n",
       " 47282,\n",
       " 1022339,\n",
       " 652032,\n",
       " 908495,\n",
       " 905702,\n",
       " 334966,\n",
       " 301381,\n",
       " 403577,\n",
       " 479885,\n",
       " 627810,\n",
       " 924923,\n",
       " 1060676,\n",
       " 306722,\n",
       " 413855,\n",
       " 333149,\n",
       " 1110303,\n",
       " 353721,\n",
       " 487363,\n",
       " 1045670,\n",
       " 248936,\n",
       " 198066,\n",
       " 634702,\n",
       " 371650,\n",
       " 34206,\n",
       " 1046159,\n",
       " 849686,\n",
       " 485076,\n",
       " 485994,\n",
       " 905554,\n",
       " 163568,\n",
       " 562565,\n",
       " 527432,\n",
       " 623014,\n",
       " 557870,\n",
       " 495074,\n",
       " 317657,\n",
       " 428469,\n",
       " 398744,\n",
       " 18562,\n",
       " 189848,\n",
       " 859949,\n",
       " 1075705,\n",
       " 634375,\n",
       " 1023988,\n",
       " 148905,\n",
       " 389049,\n",
       " 974997,\n",
       " 677793,\n",
       " 1058551,\n",
       " 151076,\n",
       " 914491,\n",
       " 1141980,\n",
       " 650380,\n",
       " 201003,\n",
       " 945582,\n",
       " 51170,\n",
       " 296587,\n",
       " 555883,\n",
       " 700745,\n",
       " 266862,\n",
       " 924954,\n",
       " 980983,\n",
       " 634185,\n",
       " 244015,\n",
       " 1038214,\n",
       " 1006276,\n",
       " 735650,\n",
       " 781706,\n",
       " 260931,\n",
       " 483990,\n",
       " 751646,\n",
       " 533716,\n",
       " 560773,\n",
       " 1105305,\n",
       " 193499,\n",
       " 217048,\n",
       " 19277,\n",
       " 727195,\n",
       " 784726,\n",
       " 944158,\n",
       " 938337,\n",
       " 812435,\n",
       " 315791,\n",
       " 374101,\n",
       " 503888,\n",
       " 376309,\n",
       " 696965,\n",
       " 434083,\n",
       " 950254,\n",
       " 301236,\n",
       " 511392,\n",
       " 898230,\n",
       " 779934,\n",
       " 791880,\n",
       " 337612,\n",
       " 541850,\n",
       " 768051,\n",
       " 829422,\n",
       " 1121091,\n",
       " 907689,\n",
       " 11869,\n",
       " 484354,\n",
       " 995680,\n",
       " 472817,\n",
       " 481443,\n",
       " 324567,\n",
       " 721185,\n",
       " 932828,\n",
       " 671763,\n",
       " 7845,\n",
       " 977803,\n",
       " 706265,\n",
       " 952390,\n",
       " 113574,\n",
       " 497935,\n",
       " 47926,\n",
       " 544254,\n",
       " 279500,\n",
       " 568045,\n",
       " 382396,\n",
       " 1030814,\n",
       " 382315,\n",
       " 333850,\n",
       " 507412,\n",
       " ...]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#随机获取text_index_s\n",
    "random.seed(123)\n",
    "#从目录中随机抽取30%的样本\n",
    "text_index_s=random.sample(\n",
    "    df_data.index.tolist(),\n",
    "    int(len(df_data)*0.3)\n",
    ")\n",
    "text_index_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>109814</th>\n",
       "      <td>27462</td>\n",
       "      <td>usa</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1587492695</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>561359</th>\n",
       "      <td>137190</td>\n",
       "      <td>france</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0552997234</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>182843</th>\n",
       "      <td>42721</td>\n",
       "      <td>canada</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0671024108</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>854047</th>\n",
       "      <td>208829</td>\n",
       "      <td>canada</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0140503897</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>559003</th>\n",
       "      <td>136348</td>\n",
       "      <td>usa</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0807220299</td>\n",
       "      <td>9.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id location  age     item_id  rating\n",
       "109814    27462      usa  0.0  1587492695     0.0\n",
       "561359   137190   france  3.0  0552997234     8.0\n",
       "182843    42721   canada  3.0  0671024108     8.0\n",
       "854047   208829   canada  0.0  0140503897     0.0\n",
       "559003   136348      usa  4.0  0807220299     9.0"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_text=df_data.loc[\n",
    "    text_index_s\n",
    "]\n",
    "df_data_text.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0.0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa  3.0  0195153448     0.0\n",
       "1        7      usa  0.0   034542252     0.0\n",
       "2        8   canada  0.0  0002005018     5.0\n",
       "3        8   canada  0.0  0060973129     0.0\n",
       "4        8   canada  0.0  0374157065     0.0"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training = df_data[\n",
    "    ~df_data.index.isin(text_index_s)\n",
    "]\n",
    "#获取剩余的训练集\n",
    "df_data_training.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(\n",
    "    df_data_text,open('./data/df_data_text.pkl','wb')\n",
    ")\n",
    "cPickle.dump(\n",
    "    df_data_training,open('./data/df_data_training.pkl','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.导入训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0.0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa  3.0  0195153448     0.0\n",
       "1        7      usa  0.0   034542252     0.0\n",
       "2        8   canada  0.0  0002005018     5.0\n",
       "3        8   canada  0.0  0060973129     0.0\n",
       "4        8   canada  0.0  0374157065     0.0"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training = cPickle.load(open('./data/df_data_training.pkl','rb'))\n",
    "df_data_training.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['usa',\n",
       " 'canada',\n",
       " 'united kingdom',\n",
       " 'germany',\n",
       " '',\n",
       " 'australia',\n",
       " 'spain',\n",
       " 'france',\n",
       " 'n/a',\n",
       " 'italy',\n",
       " 'portugal']"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training['location'].value_counts()[:11].index.tolist()\n",
    "#第五名是没有填写国籍的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "top10_location=[\n",
    "    'usa',\n",
    "    'canada',\n",
    "    'united kingdom',\n",
    "    'germany',\n",
    "    'australia',\n",
    "    'spain',\n",
    "    'france',\n",
    "    'n/a',\n",
    "    'italy',\n",
    "    'portugal'\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_data_training['location']=df_data_training['location'].apply(lambda location:location if location in top10_location else 'other')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "usa               537641\n",
       "canada             72451\n",
       "other              60023\n",
       "united kingdom     35354\n",
       "germany            27687\n",
       "australia          18604\n",
       "spain              17949\n",
       "france              9735\n",
       "n/a                 9541\n",
       "italy               8482\n",
       "portugal            7374\n",
       "Name: location, dtype: int64"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training['location'].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "开始训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import defaultdict\n",
    "feature_recommand=defaultdict(dict)\n",
    "feature_recommand_with_rating=defaultdict(dict)\n",
    "\n",
    "for location,groupby_location in df_data_training.groupby('location'):\n",
    "    for age,groupby_location_age in groupby_location.groupby('age'):\n",
    "        #获取item_id的所有值\n",
    "        item_id_value_counts=groupby_location_age['item_id'].value_counts()\n",
    "        #如果数据集很大，取75%的数字，否则取5\n",
    "        divide_boundary=max(np.percentile(item_id_value_counts,75),5)\n",
    "        #获取推荐的东西\n",
    "        groupby_location_age_top=groupby_location_age[\n",
    "            groupby_location_age['item_id'].isin(\n",
    "            item_id_value_counts[item_id_value_counts >= divide_boundary].index)\n",
    "        ]\n",
    "        item_mean_rating = groupby_location_age_top.groupby('item_id')['rating'].mean().sort_values(ascending=False)[:20]\n",
    "        #从推荐里面获取评分高的东西\n",
    "        feature_recommand[location][age] = [\n",
    "            item_id\n",
    "            for item_id in item_mean_rating.index if item_mean_rating[item_id] >= 5\n",
    "        ]\n",
    "        feature_recommand_with_rating[location][age] = [\n",
    "            {\"%s\" % item_id : round(item_mean_rating[item_id],2)}\n",
    "            for item_id in item_mean_rating.index if item_mean_rating[item_id] >= 5\n",
    "        ]\n",
    "    \n",
    "    \n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0.0: [{'0099771519': 7.0}],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: [{'0552998486': 8.8},\n",
       "               {'015602943X': 7.2},\n",
       "               {'0552140295': 6.8},\n",
       "               {'0440220602': 6.6},\n",
       "               {'0446532231': 6.2},\n",
       "               {'0007170866': 6.14},\n",
       "               {'1875989218': 6.09},\n",
       "               {'0099727412': 6.0},\n",
       "               {'0860074382': 5.91},\n",
       "               {'0140008535': 5.86},\n",
       "               {'0385335482': 5.71},\n",
       "               {'0553279556': 5.67},\n",
       "               {'1400034779': 5.4},\n",
       "               {'0743225082': 5.33},\n",
       "               {'0949206318': 5.17}],\n",
       "              4.0: [{'0091867770': 5.17}],\n",
       "              5.0: []},\n",
       "             'canada': {0.0: [{'0140505865': 9.4},\n",
       "               {'0140067477': 7.86},\n",
       "               {'076790592X': 7.4},\n",
       "               {'0553250426': 7.12},\n",
       "               {'0060392452': 7.0},\n",
       "               {'0676974791': 6.83},\n",
       "               {'080410526X': 6.8},\n",
       "               {'1552783081': 6.8},\n",
       "               {'0446350982': 6.8},\n",
       "               {'038079487X': 6.6},\n",
       "               {'0385505833': 6.4},\n",
       "               {'0676972152': 6.4},\n",
       "               {'0786867647': 6.4},\n",
       "               {'0060959037': 6.38},\n",
       "               {'0771099894': 6.25},\n",
       "               {'0812550706': 6.2},\n",
       "               {'0425122123': 6.2},\n",
       "               {'0446667900': 6.12},\n",
       "               {'0671011375': 6.0},\n",
       "               {'1550541129': 6.0}],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: [{'0060915544': 8.43},\n",
       "               {'0140042393': 8.33},\n",
       "               {'0552137030': 8.29},\n",
       "               {'0836220889': 7.83},\n",
       "               {'0425105334': 7.8},\n",
       "               {'0836218256': 7.67},\n",
       "               {'0140277439': 7.6},\n",
       "               {'0345338588': 7.6},\n",
       "               {'1853260002': 7.5},\n",
       "               {'0060935464': 7.4},\n",
       "               {'0836218353': 7.2},\n",
       "               {'0671868691': 7.17},\n",
       "               {'0446532231': 7.15},\n",
       "               {'038542017X': 7.14},\n",
       "               {'0440224764': 7.0},\n",
       "               {'0770422578': 7.0},\n",
       "               {'0006485278': 7.0},\n",
       "               {'0451163524': 7.0},\n",
       "               {'0771060548': 6.89},\n",
       "               {'0553287893': 6.83}],\n",
       "              4.0: [{'0380718839': 8.4},\n",
       "               {'0316666343': 7.57},\n",
       "               {'0345370775': 7.0},\n",
       "               {'0684872153': 6.6},\n",
       "               {'0671758896': 6.2},\n",
       "               {'0676974805': 6.0},\n",
       "               {'0440213525': 5.57},\n",
       "               {'0515111279': 5.43},\n",
       "               {'034540288X': 5.29},\n",
       "               {'0676973094': 5.22},\n",
       "               {'0671027360': 5.2},\n",
       "               {'0684874350': 5.0}],\n",
       "              5.0: []},\n",
       "             'france': {0.0: [],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: [{'2070370003': 9.0},\n",
       "               {'2070408507': 7.33},\n",
       "               {'2253140872': 7.14},\n",
       "               {'2266084372': 7.12},\n",
       "               {'2877302202': 6.8},\n",
       "               {'22530152730': 6.6},\n",
       "               {'2070744833': 6.57},\n",
       "               {'2253072079': 6.4},\n",
       "               {'2277260029': 6.4},\n",
       "               {'2290302155': 6.33},\n",
       "               {'2070363317': 6.2},\n",
       "               {'2253153265': 6.2},\n",
       "               {'2253144452': 6.17},\n",
       "               {'2264016124': 6.17},\n",
       "               {'2226135022': 6.12},\n",
       "               {'2020306492': 6.0},\n",
       "               {'2253154393': 6.0},\n",
       "               {'2290308285': 5.89},\n",
       "               {'2253150711': 5.71},\n",
       "               {'229030039X': 5.6}],\n",
       "              4.0: [],\n",
       "              5.0: []},\n",
       "             'germany': {0.0: [{'3518366823': 6.8},\n",
       "               {'3423072571': 6.2},\n",
       "               {'3518368540': 6.0},\n",
       "               {'3423203668': 5.33},\n",
       "               {'3426029553': 5.25},\n",
       "               {'3453007867': 5.17},\n",
       "               {'3404148665': 5.0}],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: [{'3551551936': 9.6},\n",
       "               {'3551551693': 9.5},\n",
       "               {'3551551677': 9.5},\n",
       "               {'3423071516': 9.0},\n",
       "               {'3518372742': 8.0},\n",
       "               {'3257230478': 7.67},\n",
       "               {'3442727952': 7.43},\n",
       "               {'3442724686': 7.33},\n",
       "               {'3518100734': 7.33},\n",
       "               {'3596215226': 7.3},\n",
       "               {'3150000017': 7.14},\n",
       "               {'3426612704': 6.89},\n",
       "               {'3423205202': 6.88},\n",
       "               {'3499224615': 6.71},\n",
       "               {'3423202947': 6.7},\n",
       "               {'3442442354': 6.67},\n",
       "               {'3453071174': 6.6},\n",
       "               {'3551551685': 6.5},\n",
       "               {'3423204206': 6.44},\n",
       "               {'3518388762': 6.4}],\n",
       "              4.0: [],\n",
       "              5.0: []},\n",
       "             'italy': {0.0: [{'8806142100': 6.33},\n",
       "               {'8826703132': 6.08},\n",
       "               {'884590184X': 6.0},\n",
       "               {'8817131628': 5.2}],\n",
       "              2.0: [],\n",
       "              3.0: [{'8845205118': 7.67},\n",
       "               {'8807813823': 7.2},\n",
       "               {'8845915700': 7.17},\n",
       "               {'8817106259': 6.29},\n",
       "               {'8807701510': 6.2},\n",
       "               {'8807816067': 6.18},\n",
       "               {'881786983X': 6.0},\n",
       "               {'0743222229': 5.86},\n",
       "               {'8807817039': 5.83},\n",
       "               {'8807814684': 5.5},\n",
       "               {'8806161741': 5.4},\n",
       "               {'884541096X': 5.4},\n",
       "               {'8845290077': 5.29},\n",
       "               {'8817106100': 5.25},\n",
       "               {'0451164075': 5.2},\n",
       "               {'8807816059': 5.1},\n",
       "               {'8804342838': 5.09},\n",
       "               {'9770390107900': 5.0}],\n",
       "              4.0: [],\n",
       "              5.0: []},\n",
       "             'n/a': {0.0: [], 3.0: [], 4.0: []},\n",
       "             'other': {0.0: [{'8826703132': 9.0},\n",
       "               {'0060008024': 8.0},\n",
       "               {'0439064872': 7.38},\n",
       "               {'1558743669': 7.2},\n",
       "               {'0440211727': 7.0},\n",
       "               {'0330332775': 6.8},\n",
       "               {'0140298479': 6.67},\n",
       "               {'0380789019': 6.6},\n",
       "               {'034536676X': 6.5},\n",
       "               {'0446679593': 6.43},\n",
       "               {'0316693251': 6.4},\n",
       "               {'0316693006': 6.4},\n",
       "               {'1400034779': 6.23},\n",
       "               {'0345337662': 6.2},\n",
       "               {'0375706771': 6.2},\n",
       "               {'0385335881': 6.2},\n",
       "               {'0345339681': 6.17},\n",
       "               {'0553296981': 6.17},\n",
       "               {'044651652X': 6.12},\n",
       "               {'0062502182': 6.0}],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: [{'0553296981': 9.38},\n",
       "               {'0441001971': 8.6},\n",
       "               {'0590353403': 8.5},\n",
       "               {'0671793489': 8.4},\n",
       "               {'0553213148': 7.6},\n",
       "               {'0515131229': 7.4},\n",
       "               {'0446310786': 7.3},\n",
       "               {'0439139597': 7.22},\n",
       "               {'0345378490': 7.2},\n",
       "               {'0747546290': 7.14},\n",
       "               {'0842329218': 7.14},\n",
       "               {'0312924585': 7.0},\n",
       "               {'3257228007': 6.86},\n",
       "               {'0786868716': 6.83},\n",
       "               {'051513628X': 6.8},\n",
       "               {'0151008116': 6.8},\n",
       "               {'0061092177': 6.8},\n",
       "               {'0375702709': 6.8},\n",
       "               {'0099800403': 6.5},\n",
       "               {'0439136350': 6.45}],\n",
       "              4.0: [],\n",
       "              5.0: []},\n",
       "             'portugal': {0.0: [],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: [{'038082101X': 8.86},\n",
       "               {'0439139600': 7.33},\n",
       "               {'0380815923': 6.6},\n",
       "               {'006050918X': 6.4},\n",
       "               {'9505156944': 6.33},\n",
       "               {'0380977788': 5.86},\n",
       "               {'002542730X': 5.75},\n",
       "               {'0460877305': 5.71},\n",
       "               {'0385721234': 5.5},\n",
       "               {'0385413041': 5.4},\n",
       "               {'9726081378': 5.4},\n",
       "               {'0811214982': 5.3},\n",
       "               {'0330262130': 5.2},\n",
       "               {'0880381744': 5.2},\n",
       "               {'0552137030': 5.2},\n",
       "               {'9722113747': 5.17},\n",
       "               {'9580464162': 5.0},\n",
       "               {'9724614565': 5.0},\n",
       "               {'1401201385': 5.0}],\n",
       "              4.0: [],\n",
       "              5.0: []},\n",
       "             'spain': {0.0: [],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: [{'8445071416': 8.69},\n",
       "               {'8420616893': 8.62},\n",
       "               {'8420613487': 8.6},\n",
       "               {'950491036X': 8.43},\n",
       "               {'8478886508': 8.4},\n",
       "               {'8478886451': 8.4},\n",
       "               {'0156013924': 7.8},\n",
       "               {'8408039369': 7.8},\n",
       "               {'8420636282': 7.6},\n",
       "               {'8495501074': 7.43},\n",
       "               {'8420432113': 7.2},\n",
       "               {'8440627203': 7.17},\n",
       "               {'8445071408': 7.0},\n",
       "               {'0452282152': 7.0},\n",
       "               {'9681501225': 7.0},\n",
       "               {'8445071769': 6.8},\n",
       "               {'8420466034': 6.8},\n",
       "               {'8445071394': 6.8},\n",
       "               {'8423309223': 6.62},\n",
       "               {'8433914545': 6.62}],\n",
       "              4.0: [{'8408043641': 6.0}],\n",
       "              5.0: []},\n",
       "             'united kingdom': {0.0: [{'0590660543': 6.33},\n",
       "               {'000649840X': 6.17},\n",
       "               {'0330367358': 6.0},\n",
       "               {'0330376519': 6.0},\n",
       "               {'1857027051': 6.0},\n",
       "               {'0749395990': 5.67},\n",
       "               {'0552124753': 5.6},\n",
       "               {'0099771519': 5.33},\n",
       "               {'0749399902': 5.0}],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: [{'1844262553': 8.35},\n",
       "               {'0091891965': 8.2},\n",
       "               {'0140620117': 7.17},\n",
       "               {'0330258648': 7.0},\n",
       "               {'1860465811': 7.0},\n",
       "               {'1857231384': 7.0},\n",
       "               {'0552145424': 6.83},\n",
       "               {'0440206154': 6.67},\n",
       "               {'0552131059': 6.62},\n",
       "               {'0192833596': 6.6},\n",
       "               {'0440235596': 6.6},\n",
       "               {'0552142379': 6.5},\n",
       "               {'0330267388': 6.4},\n",
       "               {'0671024337': 6.4},\n",
       "               {'0380002930': 6.4},\n",
       "               {'0722532938': 6.38},\n",
       "               {'0552149519': 6.2},\n",
       "               {'0140287248': 6.17},\n",
       "               {'0380813815': 6.17},\n",
       "               {'0064407667': 6.12}],\n",
       "              4.0: [{'1844262553': 8.5},\n",
       "               {'0552147680': 6.6},\n",
       "               {'0552131067': 5.8},\n",
       "               {'0552996181': 5.0}],\n",
       "              5.0: []},\n",
       "             'usa': {0.0: [{'0156004801': 9.6},\n",
       "               {'0060256672': 9.33},\n",
       "               {'0971942315': 9.0},\n",
       "               {'1576738167': 9.0},\n",
       "               {'0553351397': 8.83},\n",
       "               {'0441002935': 8.6},\n",
       "               {'0615116426': 8.45},\n",
       "               {'0140309578': 8.33},\n",
       "               {'0316735027': 8.33},\n",
       "               {'0140185232': 8.2},\n",
       "               {'0553148001': 8.17},\n",
       "               {'0395977894': 8.1},\n",
       "               {'0618002235': 8.0},\n",
       "               {'039480029X': 8.0},\n",
       "               {'0060248025': 8.0},\n",
       "               {'0877738513': 8.0},\n",
       "               {'0743455967': 8.0},\n",
       "               {'0807083054': 7.89},\n",
       "               {'0060086246': 7.8},\n",
       "               {'0451161351': 7.8}],\n",
       "              1.0: [],\n",
       "              2.0: [{'0590353403': 9.71},\n",
       "               {'0671027344': 8.8},\n",
       "               {'0439139597': 8.0},\n",
       "               {'0140348107': 8.0},\n",
       "               {'0679886370': 7.8},\n",
       "               {'0385729340': 7.5},\n",
       "               {'0394820371': 7.33},\n",
       "               {'0553272535': 7.0},\n",
       "               {'037582233X': 6.6},\n",
       "               {'0440439884': 6.4},\n",
       "               {'0345342968': 6.25},\n",
       "               {'0590962736': 6.14},\n",
       "               {'0316666343': 6.12},\n",
       "               {'059035342X': 6.08},\n",
       "               {'0345339681': 6.0},\n",
       "               {'014131088X': 5.92},\n",
       "               {'014038572X': 5.9},\n",
       "               {'0440414806': 5.88},\n",
       "               {'0440498058': 5.88},\n",
       "               {'0439136350': 5.88}],\n",
       "              3.0: [{'0066238501': 9.88},\n",
       "               {'0517693119': 9.83},\n",
       "               {'0394800389': 9.83},\n",
       "               {'0920668364': 9.67},\n",
       "               {'0395177111': 9.5},\n",
       "               {'0890876789': 9.4},\n",
       "               {'0898159954': 9.4},\n",
       "               {'0316286850': 9.4},\n",
       "               {'0375503803': 9.2},\n",
       "               {'0316779059': 9.0},\n",
       "               {'156402976X': 9.0},\n",
       "               {'0553110845': 9.0},\n",
       "               {'0060256737': 8.83},\n",
       "               {'0060968966': 8.8},\n",
       "               {'0670451932': 8.8},\n",
       "               {'0805013407': 8.6},\n",
       "               {'0060961325': 8.6},\n",
       "               {'0140195831': 8.6},\n",
       "               {'0451525663': 8.6},\n",
       "               {'0451171926': 8.4}],\n",
       "              4.0: [{'0312303467': 9.4},\n",
       "               {'0060514957': 9.0},\n",
       "               {'0553377868': 8.86},\n",
       "               {'0688167888': 8.4},\n",
       "               {'0399151451': 8.0},\n",
       "               {'1579546463': 8.0},\n",
       "               {'0380977311': 7.86},\n",
       "               {'0553379615': 7.83},\n",
       "               {'0943233828': 7.8},\n",
       "               {'0446532452': 7.57},\n",
       "               {'0553565079': 7.4},\n",
       "               {'0066214769': 7.4},\n",
       "               {'0446322180': 7.29},\n",
       "               {'0439064864': 7.22},\n",
       "               {'0399151613': 7.2},\n",
       "               {'0449911519': 7.2},\n",
       "               {'0451169514': 7.17},\n",
       "               {'0553802461': 7.12},\n",
       "               {'0312983220': 7.0},\n",
       "               {'0312983301': 7.0}],\n",
       "              5.0: [{'0440234743': 7.6}, {'044022165X': 6.4}]}})"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand_with_rating"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0.0: ['0099771519'],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: ['0552998486',\n",
       "               '015602943X',\n",
       "               '0552140295',\n",
       "               '0440220602',\n",
       "               '0446532231',\n",
       "               '0007170866',\n",
       "               '1875989218',\n",
       "               '0099727412',\n",
       "               '0860074382',\n",
       "               '0140008535',\n",
       "               '0385335482',\n",
       "               '0553279556',\n",
       "               '1400034779',\n",
       "               '0743225082',\n",
       "               '0949206318'],\n",
       "              4.0: ['0091867770'],\n",
       "              5.0: []},\n",
       "             'canada': {0.0: ['0140505865',\n",
       "               '0140067477',\n",
       "               '076790592X',\n",
       "               '0553250426',\n",
       "               '0060392452',\n",
       "               '0676974791',\n",
       "               '080410526X',\n",
       "               '1552783081',\n",
       "               '0446350982',\n",
       "               '038079487X',\n",
       "               '0385505833',\n",
       "               '0676972152',\n",
       "               '0786867647',\n",
       "               '0060959037',\n",
       "               '0771099894',\n",
       "               '0812550706',\n",
       "               '0425122123',\n",
       "               '0446667900',\n",
       "               '0671011375',\n",
       "               '1550541129'],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: ['0060915544',\n",
       "               '0140042393',\n",
       "               '0552137030',\n",
       "               '0836220889',\n",
       "               '0425105334',\n",
       "               '0836218256',\n",
       "               '0140277439',\n",
       "               '0345338588',\n",
       "               '1853260002',\n",
       "               '0060935464',\n",
       "               '0836218353',\n",
       "               '0671868691',\n",
       "               '0446532231',\n",
       "               '038542017X',\n",
       "               '0440224764',\n",
       "               '0770422578',\n",
       "               '0006485278',\n",
       "               '0451163524',\n",
       "               '0771060548',\n",
       "               '0553287893'],\n",
       "              4.0: ['0380718839',\n",
       "               '0316666343',\n",
       "               '0345370775',\n",
       "               '0684872153',\n",
       "               '0671758896',\n",
       "               '0676974805',\n",
       "               '0440213525',\n",
       "               '0515111279',\n",
       "               '034540288X',\n",
       "               '0676973094',\n",
       "               '0671027360',\n",
       "               '0684874350'],\n",
       "              5.0: []},\n",
       "             'france': {0.0: [],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: ['2070370003',\n",
       "               '2070408507',\n",
       "               '2253140872',\n",
       "               '2266084372',\n",
       "               '2877302202',\n",
       "               '22530152730',\n",
       "               '2070744833',\n",
       "               '2253072079',\n",
       "               '2277260029',\n",
       "               '2290302155',\n",
       "               '2070363317',\n",
       "               '2253153265',\n",
       "               '2253144452',\n",
       "               '2264016124',\n",
       "               '2226135022',\n",
       "               '2020306492',\n",
       "               '2253154393',\n",
       "               '2290308285',\n",
       "               '2253150711',\n",
       "               '229030039X'],\n",
       "              4.0: [],\n",
       "              5.0: []},\n",
       "             'germany': {0.0: ['3518366823',\n",
       "               '3423072571',\n",
       "               '3518368540',\n",
       "               '3423203668',\n",
       "               '3426029553',\n",
       "               '3453007867',\n",
       "               '3404148665'],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: ['3551551936',\n",
       "               '3551551693',\n",
       "               '3551551677',\n",
       "               '3423071516',\n",
       "               '3518372742',\n",
       "               '3257230478',\n",
       "               '3442727952',\n",
       "               '3442724686',\n",
       "               '3518100734',\n",
       "               '3596215226',\n",
       "               '3150000017',\n",
       "               '3426612704',\n",
       "               '3423205202',\n",
       "               '3499224615',\n",
       "               '3423202947',\n",
       "               '3442442354',\n",
       "               '3453071174',\n",
       "               '3551551685',\n",
       "               '3423204206',\n",
       "               '3518388762'],\n",
       "              4.0: [],\n",
       "              5.0: []},\n",
       "             'italy': {0.0: ['8806142100',\n",
       "               '8826703132',\n",
       "               '884590184X',\n",
       "               '8817131628'],\n",
       "              2.0: [],\n",
       "              3.0: ['8845205118',\n",
       "               '8807813823',\n",
       "               '8845915700',\n",
       "               '8817106259',\n",
       "               '8807701510',\n",
       "               '8807816067',\n",
       "               '881786983X',\n",
       "               '0743222229',\n",
       "               '8807817039',\n",
       "               '8807814684',\n",
       "               '8806161741',\n",
       "               '884541096X',\n",
       "               '8845290077',\n",
       "               '8817106100',\n",
       "               '0451164075',\n",
       "               '8807816059',\n",
       "               '8804342838',\n",
       "               '9770390107900'],\n",
       "              4.0: [],\n",
       "              5.0: []},\n",
       "             'n/a': {0.0: [], 3.0: [], 4.0: []},\n",
       "             'other': {0.0: ['8826703132',\n",
       "               '0060008024',\n",
       "               '0439064872',\n",
       "               '1558743669',\n",
       "               '0440211727',\n",
       "               '0330332775',\n",
       "               '0140298479',\n",
       "               '0380789019',\n",
       "               '034536676X',\n",
       "               '0446679593',\n",
       "               '0316693251',\n",
       "               '0316693006',\n",
       "               '1400034779',\n",
       "               '0345337662',\n",
       "               '0375706771',\n",
       "               '0385335881',\n",
       "               '0345339681',\n",
       "               '0553296981',\n",
       "               '044651652X',\n",
       "               '0062502182'],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: ['0553296981',\n",
       "               '0441001971',\n",
       "               '0590353403',\n",
       "               '0671793489',\n",
       "               '0553213148',\n",
       "               '0515131229',\n",
       "               '0446310786',\n",
       "               '0439139597',\n",
       "               '0345378490',\n",
       "               '0747546290',\n",
       "               '0842329218',\n",
       "               '0312924585',\n",
       "               '3257228007',\n",
       "               '0786868716',\n",
       "               '051513628X',\n",
       "               '0151008116',\n",
       "               '0061092177',\n",
       "               '0375702709',\n",
       "               '0099800403',\n",
       "               '0439136350'],\n",
       "              4.0: [],\n",
       "              5.0: []},\n",
       "             'portugal': {0.0: [],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: ['038082101X',\n",
       "               '0439139600',\n",
       "               '0380815923',\n",
       "               '006050918X',\n",
       "               '9505156944',\n",
       "               '0380977788',\n",
       "               '002542730X',\n",
       "               '0460877305',\n",
       "               '0385721234',\n",
       "               '0385413041',\n",
       "               '9726081378',\n",
       "               '0811214982',\n",
       "               '0330262130',\n",
       "               '0880381744',\n",
       "               '0552137030',\n",
       "               '9722113747',\n",
       "               '9580464162',\n",
       "               '9724614565',\n",
       "               '1401201385'],\n",
       "              4.0: [],\n",
       "              5.0: []},\n",
       "             'spain': {0.0: [],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: ['8445071416',\n",
       "               '8420616893',\n",
       "               '8420613487',\n",
       "               '950491036X',\n",
       "               '8478886508',\n",
       "               '8478886451',\n",
       "               '0156013924',\n",
       "               '8408039369',\n",
       "               '8420636282',\n",
       "               '8495501074',\n",
       "               '8420432113',\n",
       "               '8440627203',\n",
       "               '8445071408',\n",
       "               '0452282152',\n",
       "               '9681501225',\n",
       "               '8445071769',\n",
       "               '8420466034',\n",
       "               '8445071394',\n",
       "               '8423309223',\n",
       "               '8433914545'],\n",
       "              4.0: ['8408043641'],\n",
       "              5.0: []},\n",
       "             'united kingdom': {0.0: ['0590660543',\n",
       "               '000649840X',\n",
       "               '0330367358',\n",
       "               '0330376519',\n",
       "               '1857027051',\n",
       "               '0749395990',\n",
       "               '0552124753',\n",
       "               '0099771519',\n",
       "               '0749399902'],\n",
       "              1.0: [],\n",
       "              2.0: [],\n",
       "              3.0: ['1844262553',\n",
       "               '0091891965',\n",
       "               '0140620117',\n",
       "               '0330258648',\n",
       "               '1860465811',\n",
       "               '1857231384',\n",
       "               '0552145424',\n",
       "               '0440206154',\n",
       "               '0552131059',\n",
       "               '0192833596',\n",
       "               '0440235596',\n",
       "               '0552142379',\n",
       "               '0330267388',\n",
       "               '0671024337',\n",
       "               '0380002930',\n",
       "               '0722532938',\n",
       "               '0552149519',\n",
       "               '0140287248',\n",
       "               '0380813815',\n",
       "               '0064407667'],\n",
       "              4.0: ['1844262553', '0552147680', '0552131067', '0552996181'],\n",
       "              5.0: []},\n",
       "             'usa': {0.0: ['0156004801',\n",
       "               '0060256672',\n",
       "               '0971942315',\n",
       "               '1576738167',\n",
       "               '0553351397',\n",
       "               '0441002935',\n",
       "               '0615116426',\n",
       "               '0140309578',\n",
       "               '0316735027',\n",
       "               '0140185232',\n",
       "               '0553148001',\n",
       "               '0395977894',\n",
       "               '0618002235',\n",
       "               '039480029X',\n",
       "               '0060248025',\n",
       "               '0877738513',\n",
       "               '0743455967',\n",
       "               '0807083054',\n",
       "               '0060086246',\n",
       "               '0451161351'],\n",
       "              1.0: [],\n",
       "              2.0: ['0590353403',\n",
       "               '0671027344',\n",
       "               '0439139597',\n",
       "               '0140348107',\n",
       "               '0679886370',\n",
       "               '0385729340',\n",
       "               '0394820371',\n",
       "               '0553272535',\n",
       "               '037582233X',\n",
       "               '0440439884',\n",
       "               '0345342968',\n",
       "               '0590962736',\n",
       "               '0316666343',\n",
       "               '059035342X',\n",
       "               '0345339681',\n",
       "               '014131088X',\n",
       "               '014038572X',\n",
       "               '0440414806',\n",
       "               '0440498058',\n",
       "               '0439136350'],\n",
       "              3.0: ['0066238501',\n",
       "               '0517693119',\n",
       "               '0394800389',\n",
       "               '0920668364',\n",
       "               '0395177111',\n",
       "               '0890876789',\n",
       "               '0898159954',\n",
       "               '0316286850',\n",
       "               '0375503803',\n",
       "               '0316779059',\n",
       "               '156402976X',\n",
       "               '0553110845',\n",
       "               '0060256737',\n",
       "               '0060968966',\n",
       "               '0670451932',\n",
       "               '0805013407',\n",
       "               '0060961325',\n",
       "               '0140195831',\n",
       "               '0451525663',\n",
       "               '0451171926'],\n",
       "              4.0: ['0312303467',\n",
       "               '0060514957',\n",
       "               '0553377868',\n",
       "               '0688167888',\n",
       "               '0399151451',\n",
       "               '1579546463',\n",
       "               '0380977311',\n",
       "               '0553379615',\n",
       "               '0943233828',\n",
       "               '0446532452',\n",
       "               '0553565079',\n",
       "               '0066214769',\n",
       "               '0446322180',\n",
       "               '0439064864',\n",
       "               '0399151613',\n",
       "               '0449911519',\n",
       "               '0451169514',\n",
       "               '0553802461',\n",
       "               '0312983220',\n",
       "               '0312983301'],\n",
       "              5.0: ['0440234743', '044022165X']}})"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>9</td>\n",
       "      <td>usa</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0440234743</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>9</td>\n",
       "      <td>usa</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0452264464</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>14</td>\n",
       "      <td>usa</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0971880107</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>16</td>\n",
       "      <td>usa</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0345402871</td>\n",
       "      <td>9.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>16</td>\n",
       "      <td>usa</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0345417623</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1149732</th>\n",
       "      <td>278844</td>\n",
       "      <td>usa</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0679781587</td>\n",
       "      <td>7.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1149759</th>\n",
       "      <td>278851</td>\n",
       "      <td>usa</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1558531025</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1149765</th>\n",
       "      <td>278854</td>\n",
       "      <td>usa</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0375703063</td>\n",
       "      <td>7.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1149766</th>\n",
       "      <td>278854</td>\n",
       "      <td>usa</td>\n",
       "      <td>0.0</td>\n",
       "      <td>042516098X</td>\n",
       "      <td>7.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1149771</th>\n",
       "      <td>278854</td>\n",
       "      <td>usa</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0553579606</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>159956 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         user_id location  age     item_id  rating\n",
       "20             9      usa  0.0  0440234743     0.0\n",
       "21             9      usa  0.0  0452264464     6.0\n",
       "29            14      usa  0.0  0971880107     0.0\n",
       "30            16      usa  0.0  0345402871     9.0\n",
       "31            16      usa  0.0  0345417623     0.0\n",
       "...          ...      ...  ...         ...     ...\n",
       "1149732   278844      usa  3.0  0679781587     7.0\n",
       "1149759   278851      usa  3.0  1558531025     8.0\n",
       "1149765   278854      usa  0.0  0375703063     7.0\n",
       "1149766   278854      usa  0.0  042516098X     7.0\n",
       "1149771   278854      usa  0.0  0553579606     8.0\n",
       "\n",
       "[159956 rows x 5 columns]"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#找到热门的商品\n",
    "top2000_item_id_s=df_data_training['item_id'].value_counts()[:2000].index.tolist()\n",
    "df_data_training_top2000 = df_data_training[\n",
    "    df_data_training['item_id'].isin(top2000_item_id_s)\n",
    "]\n",
    "df_data_training_top2000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['1844262553',\n",
       " '0439139597',\n",
       " '0439136350',\n",
       " '0439064864',\n",
       " '0877017883',\n",
       " '0618002227',\n",
       " '0590353403',\n",
       " '0671027344',\n",
       " '0385199570',\n",
       " '0771060548',\n",
       " '0156528207',\n",
       " '0618129022',\n",
       " '0552128481',\n",
       " '0552131059',\n",
       " '0811801802',\n",
       " '0670032379',\n",
       " '0812550706',\n",
       " '0375756981',\n",
       " '0670894605',\n",
       " '0811825558']"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#获取最火的前二十的\n",
    "top20_item_id_s = df_data_training_top2000.groupby('item_id')['rating'].mean().sort_values(ascending=False)[:20].index.tolist()\n",
    "top20_item_id_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "for location in feature_recommand.keys():\n",
    "    for age in feature_recommand[location].keys():\n",
    "        feature_recommand_len = len(feature_recommand[location][age])\n",
    "        feature_recommand[location][age] += top20_item_id_s[:20-feature_recommand_len]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(feature_recommand,open('./data/feature_recommand.pkl','wb'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "#读取推荐列表\n",
    "feature_recommand = cPickle.load(open('./data/feature_recommand.pkl','rb'))\n",
    "#导入测试机\n",
    "df_data_text = cPickle.load(open('./data/df_data_text.pkl','rb'))\n",
    "#处理location\n",
    "top_location_s = list(feature_recommand.keys())\n",
    "df_data_text['location'] = df_data_text['location'].apply(lambda location : location if location in top_location_s else 'other')\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "#得到准确率和召回率\n",
    "\n",
    "union_quantity = 0#为用户推荐的，用户也喜欢的\n",
    "recommand_quantity = 0#用户推荐的\n",
    "user_fav_quantity = 0#用户喜欢的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "for location,groupby_location in df_data_text.groupby('location'):\n",
    "    for age,groupby_location_age in groupby_location.groupby('age'):\n",
    "        for user_id,groupby_location_age_userid in groupby_location_age.groupby('user_id'):\n",
    "            items_rating = groupby_location_age_userid.groupby('item_id')['rating'].mean().sort_values(ascending=False)\n",
    "            user_fav_items = [\n",
    "                item_id\n",
    "                for item_id in items_rating.index if items_rating[item_id] >= 5\n",
    "            ]\n",
    "            recommand_items=feature_recommand[location][age]\n",
    "            union_quantity+=len(\n",
    "                set(user_fav_items)&set(recommand_items)\n",
    "            )\n",
    "            recommand_quantity += len(recommand_items)\n",
    "            user_fav_quantity += len(user_fav_items)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "准确率: 0.00037735133495145633\n",
      "召回率: 0.0032272712529596835\n"
     ]
    }
   ],
   "source": [
    "print('准确率:',union_quantity / recommand_quantity)\n",
    "print('召回率:',union_quantity / user_fav_quantity)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
